package com.easy.framework.database.page;

import com.easy.framework.common.model.BaseQuery;
import com.easy.framework.common.utils.ServletUtils;
import com.github.pagehelper.ISelect;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * 分页工具类
 *
 * @author Easy
 */
public class PageUtil extends PageHelper {
    /**
     * 当前页码
     */
    public static final String PAGE_NUM = "pageNum";

    /**
     * 每页数据条数
     */
    public static final String PAGE_SIZE = "pageSize";

    /**
     * 分页合理化
     */
    public static final String REASONABLE = "reasonable";

    /**
     * 分页查询
     *
     * @param pageNum    --当前页码
     * @param pageSize   --每页数据条数
     * @param reasonable --分页合理化
     * @param select     --数据查询接口
     * @param <T>        --数据对象
     * @return --返回分页数据
     */
    public static <T> Pagination<T> page(Integer pageNum, Integer pageSize, boolean reasonable, ISelect select) {
        PageInfo<T> pageInfo = PageHelper.<T>startPage(pageNum, pageSize).setReasonable(reasonable).<T>doSelectPageInfo(select);
        return new Pagination<>(pageInfo.getTotal(), pageInfo.getList());
    }

    /**
     * 分页查询
     *
     * @param pageNum  --当前页码
     * @param pageSize --每页数据条数
     * @param select   --数据查询接口
     * @param <T>      --数据对象
     * @return --返回分页数据
     */
    public static <T> Pagination<T> page(Integer pageNum, Integer pageSize, ISelect select) {
        return page(pageNum, pageSize, true, select);
    }

    /**
     * 分页查询
     *
     * @param query  --查询对象
     * @param select --数据查询接口
     * @param <T>    --数据对象
     * @return --返回分页数据
     */
    public static <T> Pagination<T> page(BaseQuery query, ISelect select) {
        return page(query.getPageNum(), query.getPageSize(), query.getReasonable(), select);
    }

    /**
     * 分页查询
     *
     * @param select --数据查询接口
     * @param <T>    --数据对象
     * @return --返回分页数据
     */
    public static <T> Pagination<T> page(ISelect select) {
        int pageNum = ServletUtils.getParameterToInt(PAGE_NUM, 1);
        int pageSize = ServletUtils.getParameterToInt(PAGE_SIZE, 20);
        boolean reasonable = ServletUtils.getParameterToBool(REASONABLE, true);
        return page(pageNum, pageSize, reasonable, select);
    }

    /**
     * 内存数据分页
     *
     * @param pageNum  --当前页码
     * @param pageSize --每页数据条数
     * @param list     --数据列表
     * @param <T>      --数据对象
     * @return --返回分页数据
     */
    public static <T> Pagination<T> page(Integer pageNum, Integer pageSize, List<T> list) {
        // 创建Page对象
        Page<T> page = new Page<>(pageNum, pageSize);
        page.setTotal(list.size());
        // 计算分页起始和结束索引
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, list.size());
        // 获取分页数据
        if (startIndex <= endIndex) {
            page.addAll(list.subList(startIndex, endIndex));
        }
        PageInfo<T> pageInfo = new PageInfo<>(page);
        return new Pagination<>(pageInfo.getTotal(), pageInfo.getList());
    }


    /**
     * 清理分页的线程变量
     */
    public static void clearPage() {
        PageHelper.clearPage();
    }

}
